package demo3;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 石方旭
 * Date: 2022-08-01
 * Time: 14:31
 */
//实现懒汉模式
public class Singleton {

    //1.使用volatile保证内存可见性和禁止指令重排序
    //2.先将对象初始化为null,当需要实例化对象时在进行创建
    private volatile static Singleton instance = null;
    //设置构造方法
    private Singleton(){
        //私有构造方法,防止其他类实例化对象
    }
    //获取到实例
    //1.使用双重if是为了降低竞争锁的概率
    public Singleton getInstance(){
        //外层if是用来判断实例有没有初始化好?
        //1.如果已经初始化,不需要竞争锁,不进入if,直接往下执行
        //2.如果没有初始化尝试竞争锁
        if(instance==null){
            //使用synchronized原因是
            //1.防止多个线程同时创建,将读和写打包成一个原子->保证原子性,让其线程竞争锁
            synchronized(Singleton.class){
                //里层if: 当线程拿到锁之后,再来判断是否要真正的创建实例
                 if(instance==null){
                     instance = new Singleton();//实例化对象
                 }
            }
        }
        return instance;
    }
}
